;;*****************************************************************************************
;;Inteligencia Artificial II
;;Practica 3 - Baloncesto
;;Alfonso Sendra Gamero
;;*****************************************************************************************

(dribble-on practica_3_traza.txt)

(clear)

;;*****************************************************************************************
;; definiciones de clases
;;*****************************************************************************************
(defclass EQUIPO (is-a USER)
(slot nombre)
(slot entrenador)
(multislot uniforme)
(multislot jugadores))

(defclass PERSONA (is-a USER)
(slot nombre (visibility public))
(slot edad (type INTEGER) (visibility public)))

(defclass HOMBRE_ADULTO (is-a PERSONA)
(slot altura (type INTEGER) (visibility public)))

(defclass JUGADOR_BALONCESTO (is-a HOMBRE_ADULTO)
(slot equipo)
(slot tipo (allowed-values base pivot) (default base))
(slot categoria (allowed-values  normal excelente) (default normal))
(slot asistencias (type INTEGER))
(slot canastas (type INTEGER))
(slot tapones (type INTEGER)))

;;*****************************************************************************************
;; instancias predefinidas
;;*****************************************************************************************
(definstances initials
	(Estudiantes of EQUIPO
		(nombre Estudiantes) (entrenador Pedro_Perez) (jugadores Juan_Perez))
	(Cadiz of EQUIPO
		(nombre Cadiz) (entrenador Daniel_Gomez) (jugadores Antonio_Fernandez))
	(Pedro_Perez of PERSONA
		(nombre Pedro_Perez))
	(Daniel_Gomez of PERSONA
		(nombre Daniel_Gomez))	
	(Juan_Perez of JUGADOR_BALONCESTO
		(nombre Juan_Perez) (equipo Estudiantes) (tipo pivot))
	(Antonio_Fernandez of JUGADOR_BALONCESTO
		(nombre Antonio_Fernandez) (equipo Cadiz) (tipo base)))	
		
(reset)

;;*****************************************************************************************
;; evaluaCategoria cambia la categoria de un jugador en funcion de sus estadisticas:
;; asistencias, canastas y tapones
;;*****************************************************************************************
(deffunction evaluaCategoria (?objeto ?asistencias ?canastas ?tapones)
	(if (and (> ?canastas 70) (> (+ ?asistencias ?tapones) 10))
		then (send ?objeto put-categoria excelente)
		else (send ?objeto put-categoria normal)
	)
)

;;*****************************************************************************************
;; evaluaTipo cambia el tipo de un jugador a base si mide menos de 190
;;*****************************************************************************************
(deffunction evaluaTipo (?objeto ?altura ?tipo)
	(if (and (< ?altura 190) (eq ?tipo pivot))
		then (send ?objeto put-tipo base)
	)
)

;;*****************************************************************************************
;;daemon con el que controlo la categoria del jugador
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO put-asistencias after (?value)
	(evaluaCategoria ?self ?value ?self:canastas ?self:tapones)
)

;;*****************************************************************************************
;;daemon con el que controlo la categoria del jugador
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO put-canastas after (?value)
	(evaluaCategoria ?self ?self:asistencias ?value ?self:tapones)
)

;;*****************************************************************************************
;;daemon con el que controlo la categoria del jugador
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO put-tapones after (?value)
	(evaluaCategoria ?self ?self:asistencias ?self:canastas ?value)
)

;;*****************************************************************************************
;;daemon con el que controlo que un pivot de menos de 190 sea base
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO put-altura after (?value)
	(evaluaTipo ?self ?value ?self:tipo)
)

;;*****************************************************************************************
;;daemon con el que controlo que un pivot de menos de 190 sea base
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO put-tipo after (?value)
	(evaluaTipo ?self ?self:altura ?value)
)

;;*****************************************************************************************
;;nuevo gestor con el que incluyo a un jugador dentro del slot jugadores de su equipo
;;incluye todos los daemons: around, before, primary, after
;;*****************************************************************************************
(defmessage-handler JUGADOR_BALONCESTO asigna-equipo before ()
    (printout t "preparados para inlcuir al jugador " ?self:nombre " dentro del equipo " ?self:equipo crlf)
)

(defmessage-handler JUGADOR_BALONCESTO asigna-equipo primary ()
	(send (symbol-to-instance-name ?self:equipo) put-jugadores (send (symbol-to-instance-name ?self:equipo) get-jugadores) ?self:nombre)
	(bind ?retorno "primary")
)

(defmessage-handler JUGADOR_BALONCESTO asigna-equipo after ()
	(printout t "el jugador " ?self:nombre " ha sido incluido exitosamente dentro del equipo " ?self:equipo crlf)
)

(defmessage-handler JUGADOR_BALONCESTO asigna-equipo around ()
	(printout t "around comienza antes que ningun otro handler" crlf)
	(call-next-handler)
	(printout t "around termina despues que ningun otro handler" crlf)
	(bind ?retorno "around")
)



;;*****************************************************************************************
;;con estas estadisticas el jugador pasa a categoria excelente
;;*****************************************************************************************
(send [Juan_Perez] put-asistencias 15)

(send [Juan_Perez] put-tapones 1)

(send [Juan_Perez] put-canastas 78)

;;*****************************************************************************************
;;con estas estadisticas el jugador permanece en categoria normal
;;*****************************************************************************************
(send [Antonio_Fernandez] put-asistencias 3)

(send [Antonio_Fernandez] put-tapones 2)

(send [Antonio_Fernandez] put-canastas 58)

;;*****************************************************************************************
;;con esta altura el juagador pasa a tipo base
;;*****************************************************************************************
(send [Juan_Perez] put-altura 185)

;;*****************************************************************************************
;;el jugador permanece como tipo base debido a que su altura es menor de 190
;;*****************************************************************************************
(send [Juan_Perez] put-tipo pivot)


;;*****************************************************************************************
;;creo un nuevo jugador y lo asigno dentro del equipo, al utilizar un daemon around el valor
;;devuelto por el gestor es el del daemon around y no el del primary
;;*****************************************************************************************
(make-instance Pau_Gasol of JUGADOR_BALONCESTO
	(nombre Pau_Gasol) (equipo Estudiantes)
)

(send [Pau_Gasol] asigna-equipo)


(run)
